/**************************************************************************** 
 * Meta，一个轻量级的静态分区Hypervisor 
 *
 * 版权(c) , 2022-
 *
 * 作者:
 *      Tupelo Shen <shenwanjiang2013@163.com>
 *
 * Meta是一个自由软件，你可以在遵循GNU GPLv2协议的条件下，重新修改并发布它。
 *
 ***************************************************************************/
#include <arch/smc.h>

/****************************************************************************
 ****                           公共函数定义                             ****
 ****************************************************************************/
/**
 * 功能描述: smc异常调用
 * 入口参数: x0
 *           x1
 *           x2
 *           x3
 * 出口参数: void
 * 返 回 值: uint64_t：成功返回0，否则返回错误码
 * 修改日期: 2022-09-21
 */
unsigned long smc_call(unsigned long x0,
                       unsigned long x1,
                       unsigned long x2,
                       unsigned long x3,
                       struct smc_res *res)
{
    register unsigned long r0 asm("x0") = x0;
    register unsigned long r1 asm("x1") = x1;
    register unsigned long r2 asm("x2") = x2;
    register unsigned long r3 asm("x3") = x3;

    asm volatile("smc   #0\n" : "=r"(r0) : "r"(r0), "r"(r1), "r"(r2), "r"(r3));

    if (res != NULL) {
        res->x0 = r0;
        res->x1 = r1;
        res->x2 = r2;
        res->x3 = r3;
    }

    return r0;
}
